// ColorDlgBar.cpp : implementation file
//

#include "stdafx.h"
#include "Vincent.h"
#include "ColorDlgBar.h"

#include "MainFrm.h"
#include "VincentDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CColorDlgBar dialog


CColorDlgBar::CColorDlgBar(CWnd* pParent /*=NULL*/) : CDialogBar()
{
	//{{AFX_DATA_INIT(CColorDlgBar)
	m_cbPenWidth = -1;
	m_bFill = FALSE;
	//}}AFX_DATA_INIT
}


void CColorDlgBar::DoDataExchange(CDataExchange* pDX)
{
	CDialogBar::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CColorDlgBar)
	DDX_CBIndex(pDX, IDC_COMBO_PENWIDTH, m_cbPenWidth);
	DDX_Check(pDX, IDC_CHECK_FILL, m_bFill);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CColorDlgBar, CDialogBar)
	//{{AFX_MSG_MAP(CColorDlgBar)
	ON_BN_CLICKED(IDC_SETCOLOR_FOREGROUND, OnSetColorForeground)
	ON_BN_CLICKED(IDC_SETCOLOR_BACKGROUND, OnSetColorBackground)
	ON_WM_PAINT()
	ON_CBN_SELCHANGE(IDC_COMBO_PENWIDTH, OnSelchangeComboPenwidth)
	ON_BN_CLICKED(IDC_CHECK_FILL, OnCheckFill)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorDlgBar message handlers

void CColorDlgBar::OnSetColorForeground() 
{
	CVincentDoc* pVincentDoc = (CVincentDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
	CColorDialog dlg(pVincentDoc->GetForegroundColor());
	
	// 색상 선택 다이얼로그 박스에서 색상을 골라서, Doc의 전경색으로 설정한다.
	if (dlg.DoModal() == IDOK)
		pVincentDoc->SetForegroundColor(dlg.GetColor());
}

void CColorDlgBar::OnSetColorBackground() 
{
	CVincentDoc* pVincentDoc = (CVincentDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
	CColorDialog dlg(pVincentDoc->GetBackgroundColor());
	
	// 색상 선택 다이얼로그 박스에서 색상을 골라서, Doc의 배경색으로 설정한다.
	if (dlg.DoModal() == IDOK)
		pVincentDoc->SetBackgroundColor(dlg.GetColor());
}

void CColorDlgBar::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// 다이얼로그바의 전경색/배경색 이미지 컨트롤을 불러온다.
	CDC* pForeDC = this->GetDlgItem(IDC_SETCOLOR_FOREGROUND)->GetDC();
	CDC* pBackDC = this->GetDlgItem(IDC_SETCOLOR_BACKGROUND)->GetDC();
	
	CRect rt;	// 어차피 Fore와 Back의 크기는 같으므로, CRect 한개로 같이 사용한다.
	this->GetDlgItem(IDC_SETCOLOR_FOREGROUND)->GetClientRect(&rt);
	
	// 테두리를 1씩 줄인다. (컨트롤의 프레임은 색칠 안하기 위해서)
	rt.left += 1;
	rt.top += 1;
	rt.bottom -= 1;
	rt.right -= 1;
	
	// Document를 가져온다.
	CVincentDoc* pVincentDoc = (CVincentDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
	
	// Document에서 색상을 가져온다.
	CBrush brushForeground(pVincentDoc->GetForegroundColor());
	CBrush brushBackground(pVincentDoc->GetBackgroundColor());
	
	// 테두리를 1씩 뺀 상태에서 색칠한다. (결국 내용만 색칠하게 됨)
	pForeDC->FillRect(&rt, &brushForeground);	// Document의 전경색으로 색칠한다.
	pBackDC->FillRect(&rt, &brushBackground);	// Document의 배경색으로 색칠한다.
	
	// 그려질때마다, 컨트롤들을 Document의 값에 맞춰준다.
	m_cbPenWidth = pVincentDoc->GetPenWidth() - 1;
	m_bFill = pVincentDoc->GetFillOut();
	UpdateData(FALSE);	// 멤버변수에서 다이얼로그로 보낸다.
}

void CColorDlgBar::OnSelchangeComboPenwidth() 
{
	// 다이얼로그의 데이터를 변수에 받아온다.
	UpdateData(TRUE);
	
	// Document에 접근해서 펜 굵기를 설정.
	// 1을 더하는 이유는 콤보박스는 0부터 시작하고, 펜 굵기는 1부터 시작하기 때문..
	((CVincentDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument())->SetPenWidth(m_cbPenWidth + 1);
}

void CColorDlgBar::OnCheckFill() 
{
	// 다이얼로그의 데이터를 변수에 받아온다.
	UpdateData(TRUE);
	
	// Document에 접근해서 색칠할지 안할지를 설정한다.
	((CVincentDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument())->SetFillOut(m_bFill);
}
